package pe.gob.bcrp.sgci.gestion.reportes.util;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class NumberUtil {
	
	public static final int FORMATO_POSITIVO_3_DECIMALES = 1;
	public static final int FORMATO_POSITIVO_2_DECIMALES = 2;
	public static final int FORMATO_NEGATIVO_3_DECIMALES = 3;
	public static final int FORMATO_NEGATIVO_2_DECIMALES = 4;
	public static final int FORMATO_TIPO_DE_CAMBIO = 5;
	public static final int FORMATO_3_DECIMALES = 6;
	public static final int FORMATO_2_DECIMALES = 7;

	public static final int FORMATO_POSITIVO_7_DECIMALES = 8;
	public static final int FORMATO_NEGATIVO_7_DECIMALES = 9;
	public static final int FORMATO_7_DECIMALES = 10;
	
	
	private static DecimalFormatSymbols formatSymbols;
	private static String formato;
	private static DecimalFormat df;
	private static String numeroFormateado;
	
	public static String formatear(Double dato, int opcion){
		if(dato==null) return "";
		//Funciona usando como opcion cualquier variable static de NumberUtil para cualquier proyecto
		//por ejemplo NumberUtil.FORMATO_2_DECIMALES
		BigDecimal numero = new BigDecimal(dato);
		iniciarVariables();
		switch(opcion){
			case FORMATO_POSITIVO_3_DECIMALES:
				formato = "#,##0.000";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				numeroFormateado = df.format(numero.doubleValue()) + "&nbsp;";
				break;
			case FORMATO_POSITIVO_2_DECIMALES:
				formato = "#,##0.00";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				numeroFormateado = df.format(numero.doubleValue()) + "&nbsp;";
				break;
			case FORMATO_NEGATIVO_3_DECIMALES:
				formato = "#,##0.000";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				String tmp = df.format(numero.doubleValue());
				numeroFormateado = "(" + tmp.substring(1) + ")";
				break;
			case FORMATO_NEGATIVO_2_DECIMALES:
				formato = "#,##0.00";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				String tmp2 = df.format(numero.doubleValue());
				numeroFormateado = "(" + tmp2.substring(1) + ")";
				break;
			case FORMATO_TIPO_DE_CAMBIO:
				formato = "#,##0.000000";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				numeroFormateado = df.format(numero.doubleValue());
				break;
			case FORMATO_3_DECIMALES:
				if(numero.doubleValue() < 0){
					formatear(dato,FORMATO_NEGATIVO_3_DECIMALES);
				}else{
					formatear(dato,FORMATO_POSITIVO_3_DECIMALES);
				}
				break;
			case FORMATO_2_DECIMALES:
				if(numero.doubleValue() < 0){
					formatear(dato,FORMATO_NEGATIVO_2_DECIMALES);
				}else{
					formatear(dato,FORMATO_POSITIVO_2_DECIMALES);
				}
				break;
				
			case FORMATO_7_DECIMALES:
				if(numero.doubleValue() < 0){
					formatear(dato,FORMATO_NEGATIVO_7_DECIMALES);
				}else{
					formatear(dato,FORMATO_POSITIVO_7_DECIMALES);
				}
				break;
			case FORMATO_POSITIVO_7_DECIMALES://2
				formato = "#,##0.0000000";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				numeroFormateado = df.format(numero.doubleValue()) + "&nbsp;";
				break;
			case FORMATO_NEGATIVO_7_DECIMALES://3
				formato = "#,##0.0000000";
				df = new DecimalFormat(formato, formatSymbols);
				df.setGroupingSize(3);
				String tmp7 = df.format(numero.doubleValue());
				numeroFormateado = "(" + tmp7.substring(1) + ")";
				break;
		}
		return numeroFormateado;
	}
	public static String formatear(Double dato, String opcionString) 
			throws NoSuchFieldException, IllegalAccessException{
		//Variacion para usar NumberUtil dentro de BIRT
		//Pues no permite usar variables static
		//opcionString debe coincidir con el nombre de la variable static a usar
		//por ejemplo String opcionString = "FORMATO_2_DECIMALES"
		NumberUtil nu = new NumberUtil();
		int opcion = nu.getIntField(opcionString);
		return formatear(dato,opcion);
	}
	private int getIntField(String fieldName)
	        throws NoSuchFieldException, IllegalAccessException {
	    Field field = getClass().getDeclaredField(fieldName);
	    int num = field.getInt(this);
	    return num;
	}
	//metodos de ayuda a la misma clase
	private static void iniciarVariables(){
		formatSymbols = new DecimalFormatSymbols();
		formatSymbols.setDecimalSeparator(',');
		formatSymbols.setGroupingSeparator(' ');
	}
	
}
